package com.fulihui.usercore.enums;

import java.util.List;


/**
 * 用户身份工具类
 * <p>预留8位二进制位做8种身份标识
 * <p>如：0001  0010  0100  1000
 * Created by Willard.Hu on 2016/5/27.
 */
public enum UserIdentity {

    /**
     * 用户身份 0001
     */
    USER(0x01, "用户"),

    /**
     * 商户身份 0010
     */
    MERCHANT(0x02, "商户"),

    ;

    /**
     * 身份值
     */
    private int value;
    /**
     * 身份描述
     */
    private String desc;

    /**
     * 有参构造方法
     *
     * @param value 身份值
     * @param desc  身份描述
     */
    UserIdentity(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    public int getValue() {
        return value;
    }

    /**
     * 获取身份中文描述
     *
     * @return 中文描述
     */
    public String getDesc() {
        return desc;
    }

    /**
     * 合并身份值，获取合集
     *
     * @param identityList 身份枚举集合
     * @return 合并后的值
     */
    public static int merge(List<UserIdentity> identityList) {
        if (identityList == null || identityList.isEmpty()) {
            return 0;
        }
        int rs = 0;
        for (UserIdentity identity : identityList) {
            rs |= identity.value;
        }
        return rs;
    }

    /**
     * 判断是否有身份
     *
     * @param merged   合并后的值
     * @param identity 需要判断的身份
     * @return 包含判断身份返回true，否则返回false
     */
    public static boolean has(int merged, UserIdentity identity) {
        return (merged & identity.value) > 0;
    }

    /**
     * 追加身份
     *
     * @param merged       之前合并后的值
     * @param identityList 需要添加的身份集合
     * @return 新合并后的值
     */
    public static int append(int merged, List<UserIdentity> identityList) {
        if (identityList == null || identityList.size() == 0) {
            return merged;
        }
        int rs = merged;
        for (UserIdentity identity : identityList) {
            rs |= identity.value;
        }
        return rs;
    }

    /**
     * 减少身份
     *
     * @param merged  之前合并后的值
     * @param removed 需要移除的身份集合
     * @return 移除后的值
     */
    public static int remove(int merged, UserIdentity removed) {
        return merged ^ removed.value;
    }
}
